#ifndef SOCKET_LIB_H
#define SOCKET_LIB_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <sys/select.h>
#include <errno.h>
#include "log_module.h"
#include "thread_pool.h"

#define HEADER_LENGTH 4 // 数据包头部长度，4 字节
#define MAX_BUFFER_SIZE 1024 // 最大缓冲区大小

enum MODE{
    THREAD_POOL_TCP,    // 并发实现方式为线程池
    SELECT_TCP,         // 并发实现方式为基于select的IO多路复用
    EPOLL_TCP,          // 并发实现方式为基于epoll的IO多路复用
};

typedef struct {
    char *host;             // IP地址
    int port;               // 端口
    int max_connections;    // 最大连接数
    int server_socket;      // 套接字描述符
    int mode;               // 并发实现方式
} SocketServer;

typedef struct {
    char *host;         // 请求服务器IP地址
    int port;           // 服务器端口
    int client_socket;  // 套接字文件描述符
} SocketClient;

// 存储客户端信息的结构体
struct SockInfo
{
    int fd;                      // 通信套接字
    pthread_t tid;               // 线程ID
    struct sockaddr_in addr;     // 客户端地址信息
    void (*process_request)(const char *, char *);
};

// 外部传入的客户端业务逻辑处理的回调函数类型
typedef void (*client_request)(const char *, char *);


// 启动服务器并处理客户端连接的回调函数类型
typedef void (*Server_start)(SocketServer *server, client_request request_handler);

/**
 * @brief 初始化服务器配置
 * 
 * 设置服务器的基本信息，包括 IP、端口以及最大连接数。
 * @param server SocketServer 结构体指针，用于存储服务器的配置。
 * @param host 服务器的 IP 地址。
 * @param port 服务器的监听端口。
 * @param max_connections 最大连接数。
 * @param mode 并发实现方式。
 */
void socket_server_init(SocketServer *server, char *host, int port, int max_connections, int mode);

/**
 * @brief 启动服务器并处理客户端连接
 * 
 * 创建 socket，绑定地址，监听端口，并使用线程池处理客户端连接。
 * @param server SocketServer 结构体指针，包含服务器的配置。
 * @param client_handler 客户端处理函数指针，用于处理单个客户端的业务逻辑。
 */
void socket_server_start(SocketServer *server, client_request request_handler);


/**
 * @brief 启动服务器并处理客户端连接（基于 线程池 实现）
 * 
 * 创建 socket，绑定地址，监听端口，并使用线程池处理客户端连接。
 * @param server SocketServer 结构体指针，包含服务器的配置。
 * @param client_handler 客户端处理函数指针，用于处理单个客户端的业务逻辑。
 */
void socket_server_start_threadpool(SocketServer *server, client_request request_handler);
/**
 * @brief 启动服务器并处理客户端连接（基于 select 实现）
 * 
 * 该函数启动 TCP 服务器，使用 select 实现 I/O 多路复用，
 * 并调用用户自定义的处理函数对客户端请求进行响应。
 * 
 * @param server         SocketServer 结构体指针，包含服务器的配置。
 * @param request_handler 客户端请求处理函数指针，负责处理单个客户端的业务逻辑。
 */


void socket_server_start_select(SocketServer *server, client_request request_handler);
/**
 * @brief 启动服务器并处理客户端连接（基于 epoll 实现）
 * 
 * 该函数负责启动 TCP 服务器，使用 epoll 高效管理客户端连接，
 * 并调用用户自定义的处理函数对客户端请求进行响应。
 * 
 * 主要功能：
 * 1. 创建和配置服务器套接字。
 * 2. 使用 epoll 管理多客户端的连接。
 * 3. 使用用户定义的业务逻辑处理客户端请求。
 * 
 * @param server         SocketServer 结构体指针，包含服务器的配置。
 * @param request_handler 客户端请求处理函数指针，负责处理单个客户端的业务逻辑。
 */


void socket_server_start_epoll(SocketServer *server, client_request request_handler);
/**
 * @brief 停止服务器
 * 
 * 关闭服务器 socket。
 * @param server SocketServer 结构体指针。
 */
void socket_server_stop(SocketServer *server);

/**
 * @brief 初始化 SocketClient 结构体。
 * 
 * @param client SocketClient 实例
 * @param host 服务器地址
 * @param port 服务器端口
 */
void socket_client_init(SocketClient *client, char *host, int port);

/**
 * @brief 连接到服务器。
 * 
 * @param client SocketClient 实例
 */
void socket_client_connect(SocketClient *client);

/**
 * @brief 发送消息到服务器并接收响应。
 * 
 * @param client SocketClient 实例
 * @param message 待发送的消息
 * @param response 用于存储服务器响应的指针, response需要动态释放
 */
void socket_client_send(SocketClient *client, char *message, char **response);

/**
 * @brief 关闭与服务器的连接。
 * 
 * @param client SocketClient 实例
 */
void socket_client_close(SocketClient *client);

#endif
